package ts;

import java.util.ArrayList;
import java.util.Iterator;

public class TipoTupla extends Tipo {

	private ArrayList<ParamTupla> campos;

	public TipoTupla(ArrayList<ParamTupla> c) {
		this.tipo = "tupla";
		this.campos = new ArrayList<ParamTupla>(c);
		this.tam = tamTupla(campos);
	}

	public String muestraCampos() {
		Iterator<ParamTupla> it = campos.iterator();
		String s = "[ ";
		while (it.hasNext()) {
			ParamTupla c = it.next();
			s += " <" + muestraTipo(c.getTipo()) + ", desp: " + c.getDesp()
					+ ">,";
		}

		return s.substring(0, s.length() - 1) + "]";
	}

	public Tipo getTipoTuplaPos(int pos) {
		return campos.get(pos).getTipo();
	}

	public int getDespTuplaPos(int pos) {
		return campos.get(pos).getDesp();
	}

	public boolean existeCampo(int pos) {
		return pos < campos.size();
	}

	public String muestraTipo(Tipo tipo) {
		String mostrar = "";
		String nombreTipo = tipo.getTipo();
		if (nombreTipo.equals("natural") || nombreTipo.equals("integer")
				|| nombreTipo.equals("float") || nombreTipo.equals("character")
				|| nombreTipo.equals("boolean"))
			mostrar += ", tipo: <t: " + nombreTipo + ", tam: " + tipo.getTam();
		else if (nombreTipo.equals("array")) {
			mostrar += ", tipo: <t: " + tipo.getTipo() + ", nelems: "
					+ ((TipoArray) tipo).getNumElem() + ", tbase: ";
			Tipo tb = ((TipoArray) tipo).getTipoBase();
			if (tb.getTipo().equals("ref"))
				mostrar += "< t: ref " + ", id: "
						+ ((TipoIdent) tb).getId() + ", tam: "
						+ ((TipoIdent) tb).getTam();
			else if (tb.getTipo().equals("array"))
				mostrar += "< t: array , nelems: "
						+ ((TipoArray) tb).getNumElem() + ", tbase: "
						+ ((TipoArray) tb).getTipoBase().getTipo() + ", tam: "
						+ ((TipoArray) tb).getTam() + "> , tam: "
						+ ((TipoArray) tipo).getTam();
		} else if (tipo.getTipo().equals("tupla"))
			mostrar += " tipo: <t: " + tipo.getTipo() + ", campos:"
					+ ((TipoTupla) tipo).muestraCampos() + ", tam: "
					+ ((TipoTupla) tipo).getTam();
		else if (tipo.getTipo().equals("ref")) {
			mostrar += ", tipo: <t: " + tipo.getTipo() + ", id: "
					+ ((TipoIdent) tipo).getId() + ", tam: "
					+ ((TipoIdent) tipo).getTam();
		}
		return mostrar;
	}
	
	private int tamTupla(ArrayList<ParamTupla> campos) {
		int tamTupla = 0;
		Iterator<ParamTupla> it = campos.iterator();
		while (it.hasNext())
			tamTupla += it.next().getTipo().tam;
		return tamTupla;
	}

	public ArrayList<ParamTupla> getCampos() {
		return campos;
	}

	

}